package com.example.remotecontrol.di

import android.content.Context
import com.example.remotecontrol.data.model.RemoteCodeLibrary
import com.example.remotecontrol.util.BluetoothManager
import com.example.remotecontrol.util.IRManager
import com.example.remotecontrol.util.WiFiManager
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.components.ViewModelComponent
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.android.scopes.ViewModelScoped

/**
 * 遥控功能依赖注入模块
 * 提供与遥控相关的依赖，使用ViewModelComponent以确保这些依赖在ViewModel层级可用
 */
@Module
@InstallIn(ViewModelComponent::class)
object RemoteModule {
    
    /**
     * 提供遥控代码库
     */
    @Provides
    @ViewModelScoped
    fun provideRemoteCodeLibrary(): RemoteCodeLibrary {
        return RemoteCodeLibrary
    }
    
    /**
     * 提供红外控制器，视图模型作用域
     */
    @Provides
    @ViewModelScoped
    fun provideIRController(
        irManager: IRManager,
        remoteCodeLibrary: RemoteCodeLibrary
    ): IRController {
        return IRController(irManager, remoteCodeLibrary)
    }
    
    /**
     * 提供蓝牙控制器，视图模型作用域
     */
    @Provides
    @ViewModelScoped
    fun provideBluetoothController(
        bluetoothManager: BluetoothManager
    ): BluetoothController {
        return BluetoothController(bluetoothManager)
    }
    
    /**
     * 提供WiFi控制器，视图模型作用域
     */
    @Provides
    @ViewModelScoped
    fun provideWiFiController(
        wifiManager: WiFiManager
    ): WiFiController {
        return WiFiController(wifiManager)
    }
}

/**
 * 红外控制器类
 * 结合IRManager和RemoteCodeLibrary提供高级红外控制功能
 */
class IRController(
    private val irManager: IRManager,
    private val remoteCodeLibrary: RemoteCodeLibrary
) {
    /**
     * 发送红外命令
     * 
     * @param brand 设备品牌
     * @param deviceType 设备类型
     * @param command 命令名称
     * @return 是否发送成功
     */
    fun sendCommand(brand: String, deviceType: com.example.remotecontrol.data.model.DeviceType, command: String): Boolean {
        // 获取地址码
        val addressCode = remoteCodeLibrary.getAddressCode(brand, deviceType)
        
        // 获取命令映射
        val commandMap = remoteCodeLibrary.getCommandMap(brand, deviceType)
        
        // 获取命令码
        val commandCode = commandMap[command] ?: return false
        
        // 发送红外命令
        return irManager.transmitIrCommand(addressCode, commandCode)
    }
    
    /**
     * 检查设备是否支持红外功能
     * 
     * @return 是否支持红外
     */
    fun hasIrEmitter(): Boolean {
        return irManager.hasIrEmitter()
    }
}

/**
 * 蓝牙控制器类
 * 封装BluetoothManager提供便捷的蓝牙控制功能
 */
class BluetoothController(
    private val bluetoothManager: BluetoothManager
) {
    /**
     * 连接到设备
     * 
     * @param address 设备地址
     * @return 是否连接成功
     */
    suspend fun connect(address: String): Boolean {
        return bluetoothManager.connect(address)
    }
    
    /**
     * 断开连接
     */
    fun disconnect() {
        bluetoothManager.disconnect()
    }
    
    /**
     * 发送命令
     * 
     * @param command 命令
     * @return 是否发送成功
     */
    suspend fun sendCommand(command: String): Boolean {
        return bluetoothManager.sendCommand(command)
    }
    
    /**
     * 检查是否支持蓝牙
     * 
     * @return 是否支持蓝牙
     */
    fun isBluetoothSupported(): Boolean {
        return bluetoothManager.isBluetoothSupported()
    }
    
    /**
     * 检查蓝牙是否已启用
     * 
     * @return 蓝牙是否已启用
     */
    fun isBluetoothEnabled(): Boolean {
        return bluetoothManager.isBluetoothEnabled()
    }
}

/**
 * WiFi控制器类
 * 封装WiFiManager提供便捷的WiFi控制功能
 */
class WiFiController(
    private val wifiManager: WiFiManager
) {
    /**
     * 连接到设备
     * 
     * @param host 设备主机地址
     * @param port 设备端口
     * @return 是否连接成功
     */
    suspend fun connect(host: String, port: Int = 80): Boolean {
        return wifiManager.connect(host, port)
    }
    
    /**
     * 发送HTTP命令
     * 
     * @param endpoint 端点
     * @param payload 负载数据
     * @return 响应内容
     */
    suspend fun sendHttpCommand(endpoint: String, payload: String): String? {
        return wifiManager.sendHttpRequest(endpoint, payload)
    }
    
    /**
     * 发送UDP命令
     * 
     * @param command 命令内容
     * @param port 端口
     * @return 是否发送成功
     */
    suspend fun sendUdpCommand(command: String, port: Int = 9): Boolean {
        return wifiManager.sendUdpCommand(command, port)
    }
    
    /**
     * 检查WiFi是否已启用
     * 
     * @return WiFi是否已启用
     */
    fun isWifiEnabled(): Boolean {
        return wifiManager.isWifiEnabled()
    }
} 